﻿using Logger;
using System.Reflection;
using ClickLand.CorporacionPlaza.AccesoDato.Contratos;
using ClickLand.CorporacionPlaza.Comunes.Recursos;
using Logger;

namespace ClickLand.CorporacionPlaza.AccesoDato.Fabricas
{
    /// <summary> Fabrica de los dao's </summary>
    public abstract class FabricaDao:FabricaBase
    {
        #region Constructor

        /// <summary> Constructor de la clase que obtiene el manejador de la configuracion global </summary>
        /// <returns>la fabrica de los dao's</returns>
        public static FabricaDao ObtenerFabrica()
        {
            #region Instrumentacion Entrada
            if (Log.InfoHabilitado)
                Log.Info(string.Format(Recurso.EntrandoMetodo,MethodBase.GetCurrentMethod().Name));
            #endregion
            var retorno = ObtenerFabrica(ObtenerManejador());
            #region Instrumentacion Salida
            if (Log.InfoHabilitado)
                Log.Info(string.Format(Recurso.SaliendoMetodo,MethodBase.GetCurrentMethod().Name));
            #endregion
            return retorno;
        }


        /// <summary> Metodo que obtiene la fabrica segun el tipo de manejador indicado </summary>
        /// <param name="tipoBD">tipo de base de datos indicado</param>
        /// <returns>fabrica de los dao's</returns>
        private static FabricaDao ObtenerFabrica(TipoBD tipoBD)
        {
            #region Instrumentacion Entrada
            if (Log.InfoHabilitado)
                Log.Info(string.Format(Recurso.EntrandoMetodo,MethodBase.GetCurrentMethod().Name));
            #endregion
            switch (tipoBD)
            {
                case TipoBD.Oracle:
                    return null;
                case TipoBD.NHibernate:
                   return new FabricaDaoNHibernateMySql();
            }
            #region Instrumentacion Salida
            if (Log.InfoHabilitado)
                Log.Info(string.Format(Recurso.SaliendoMetodo,MethodBase.GetCurrentMethod().Name));
            #endregion
            return null;
        }

        #endregion

        #region Contratos


        /// <summary> Metodo que obtiene la instancia del dao que opera la entidad prueba </summary>
        /// <returns>IDaoPrueba implementado segun la fabrica seleccionada</returns>
        public abstract IDaoPrueba ObtenerDaoPrueba();


        /// <summary> Metodo que obtiene la instancia del dao que opera la entidad cliente </summary>
        /// <returns>IDaoCliente implementado segun la fabrica seleccionada</returns>
        public abstract IDaoCliente ObtenerDaoCliente();


        /// <summary> Metodo que obtiene la instancia del dao que opera la entidad Cannon </summary>
        /// <returns>IDaCannon implementado segun la fabrica seleccionada</returns>
        public abstract IDaoCannon ObtenerDaoCannon();


        /// <summary> Metodo que obtiene la instancia del dao que opera la entidad ContratoPension </summary>
        /// <returns>IDaoContratoPension implementado segun la fabrica seleccionada</returns>
        public abstract IDaoContratoPension ObtenerDaoContratoPension();
        

        /// <summary> Metodo que obtiene la instancia del dao que opera la entidad Establecimiento </summary>
        /// <returns>IDaoEstablecimiento implementado segun la fabrica seleccionada</returns>
        public abstract IDaoEstablecimiento ObtenerDaoEstablecimiento();


        /// <summary> Metodo que obtiene la instancia del dao que opera la entidad Fiador </summary>
        /// <returns>IDaoFiador implementado segun la fabrica seleccionada</returns>
        public abstract IDaoFiador ObtenerDaoFiador();


        /// <summary> Metodo que obtiene la instancia del dao que opera la entidad Garantia </summary>
        /// <returns>IDaoGarantia implementado segun la fabrica seleccionada</returns>
        public abstract IDaoGarantia ObtenerDaoGaratia();


        /// <summary> Metodo que obtiene la instancia del dao que opera la entidad Pension </summary>
        /// <returns>IDaoPension implementado segun la fabrica seleccionada</returns>
        public abstract IDaoPension ObtenerDaoPension();


        /// <summary> Metodo que obtiene la instancia del dao que opera la entidad Poliza </summary>
        /// <returns>IDaoPoliza implementado segun la fabrica seleccionada</returns>
        public abstract IDaoPoliza ObtenerDaoPoliza();


        /// <summary> Metodo que obtiene la instancia del dao que opera la entidad TipoEstablecimiento </summary>
        /// <returns>IDaoTipoEstablecimiento implementado segun la fabrica seleccionada</returns>
        public abstract IDaoTipoEstablecimiento ObtenerDaoTipoEstablecimiento();


        /// <summary> Metodo que obtiene la instancia del dao que opera la entidad Contrato </summary>
        /// <returns>IDaoContrato implementado segun la fabrica seleccionada</returns>
        public abstract IDaoContrato ObtenerDaoContrato();


        /// <summary> Metodo que obtiene la instancia del dao que opera la entidad Venta </summary>
        /// <returns>IDaoVenta implementado segun la fabrica seleccionada</returns>
        public abstract IDaoVenta ObtenerDaoVenta();


        /// <summary> Metodo que obtiene la instancia del dao que opera la entidad Venta </summary>
        /// <returns>IDaoVenta implementado segun la fabrica seleccionada</returns>
        public abstract IDaoProyeccion ObtenerDaoProyeccion();

        #endregion
    }
}
